category: main
step: 2_staging
sub_step: 3_hash
doc_status: ready
language: rus
main_number: "05"macro hash
| Name | Category | In Main Macro | Doc Status |
|---|---|---|---|
| entity_hash | auxiliary | hash | ready |
| link_hash | auxiliary | hash | ready |
| zero_date | auxiliary | hash | ready |
Макрос hash предназначен для добавления к данным хэш-столбцов. В дальнейшем эти столбцы пригодятся для дедупликации данных.
Имя dbt-модели (=имя файла в формате sql в папке models) должно соответствовать шаблону:
hash_{название_пайплайна}.
Например, hash_events.
Внутри этого файла вызывается макрос:
{{ datacraft.hash() }}
Над вызовом макроса в файле будет указана зависимость данных через —depends_on. То есть целиком содержимое файла выглядит, например, вот так:
-- depends_on: {{ ref('combine_events') }}
{{ datacraft.hash() }}
Этот макрос принимает следующие аргументы:
params (по умолчанию: none)disable_incremental (по умолчанию: none)override_target_model_name (по умолчанию: none)metadata (по умолчанию: результат макроса project_metadata())date_from (по умолчанию: none)date_to (по умолчанию: none)limit0 (по умолчанию: none)Сначала макрос считает имя модели - либо из передаваемого аргумента (
override_target_model_name), либо из имени файла (this.name). При использовании аргумента override_target_model_name макрос работает так, как если бы находился в модели с именем, равным значению override_target_model_name.
Название модели, полученное тем или иным способом, разбивается на части по знаку нижнего подчёркивания. Например, название hash_events разобьётся на 2 части, из этих частей макрос возьмёт в работу:
pipeline_name → eventsДля пайплайна registry макрос возьмёт ещё линк.
Если пайплайн относится к datestat или events, то материализация будет инкрементальной:
{{ config(
materialized='incremental',
order_by=('__date', '__table_name'),
incremental_strategy='delete+insert',
unique_key=['__date', '__table_name'],
on_schema_change='fail'
) }}
В других случаях - обычной:
{{ config(
materialized='table',
order_by=('__table_name'),
on_schema_change='fail'
) }}
Если имя модели не соответствует шаблону - макрос выдаст ошибку.
Далее макрос задаст паттерн, чтобы найти combine-таблицу нужного пайплайна.
Паттерн для пайплайна registry:
'combine_' ~ pipeline_name ~'_'~ link_name
Для других пайплайнов:
'combine_' ~ pipeline_name
Далее макрос будет работать с metadata.
Из метадаты будут отобраны названия всех линков проекта. Для каждого линка будут получены данные по нему - pipeline, datetime_field, main_entities, other_entities.
Далее будут отбираться такие сущности, для которых либо условие glue=yes, либо эта сущность входит в main_entities. Сущности отбираются по этим двум условиям, затем полученный список становится уникальным.
Из уникального списка сущностей отбираем те, которые либо есть в списке сущностей glue='yes', либо есть в разделе registries.
Для моделей пайплайна registry отбираем линки и сущности отдельно, чтобы выводить модели по-отдельности для каждого источника данных.
Например, у модели пайплайна registry есть в названии линк A - макрос идёт в метадату и отбирает всю информацию по этому линку A. Для модели с другим линком - B - макрос отберёт информацию по линку B.
Далее все ранее полученные данные будут использоваться при генерировании SQL-запроса.
Макрос обращается к ранее найденной при помощи паттерна таблице-источнику и берёт оттуда данные. Макрос добавляет:
Далее на основе этих данных формируется поле __id и поле __datetime.
Для создания поля __id макрос перебирает отобранные линки, и когда он находит тот, который совпадает со значением в поле __link (это поле и его значение задаются на шаге join), то он из этого линка и создаёт __id.
SELECT *,
assumeNotNull(CASE
{%- for link in links_list %}
{%- set link_hash = link ~ 'Hash' %}
WHEN __link = '{{link}}'
THEN {{link_hash}}
{% endfor %}
END) as __id
Для того, чтобы сформировать поле __datetime , макрос смотрит в метадату. Если поле datetime_field из метадаты для отобранного линка есть, то макрос приводит его к формату даты. Если такого поля в метадате нет, то макрос приведёт дефолтное поле к формату даты через дополнительный макрос zero_date.
Если аргумент limit0 активирован, то в конце SQL-запроса будет добавлено LIMIT 0.
Также в конце этого макроса есть дополнительная настройка для повышения производительности, которую можно активировать (по дефолту она в закомментированном виде):
-- SETTINGS short_circuit_function_evaluation=force_enable
Файл в формате sql в папке models. Название файла hash_events
Содержимое файла:
-- depends_on: {{ ref('combine_events') }}
{{ datacraft.hash() }}
Это пятый из основных макросов.